import errorcode from '../util/errorcode'
import axios from 'axios'
import  login from '../store/login'
import qs from 'qs'
import { message } from 'antd';
    /**0-成功*/
    /**1-登录失败*/
    /**2-操作失败*/
    /**3-无权限*/
    /**4-COOKIE,SESSION超时*/
    /**5-参数错误*/


//tips global
message.config({
    top: 50,
    duration: 2,
});
window.success = (mes) => {
    message.success(mes);
};

window.error = (mes) => {
    message.error(mes);
};

window.warning = (mes) => {
    message.warning(mes);
};

function errorState(response) {
    // console.log('失败，统一判断后端返回的错误码') 如果http状态码正常，则直接返回数据
    if (response && (response.status === 200 || response.status === 304 || response.status === 400)) {
        return response
    } else {
        window.error('网络异常')
    }
}

function successState(res, resolve) {
    if(!res){return}
    if (res.data.errorcode == "0") {
        resolve(res.data)
    } else if (res.data.errorcode == "1") {
        window.error(res.data.errormsg||'登录失败')
    } else if (res.data.errorcode == "2") {
        window.error(res.data.errormsg||'操作失败')
    } else if (res.data.errorcode == "3"){
        window.error(res.data.errormsg||'无权限')
    } else if (res.data.errorcode == "4") {
        window.error('COOKIE,SESSION超时,请重新登陆')
        localStorage.setItem('isAuth',false)
    }else{
        window.error(res.data.errormsg||'参数错误')
    }
}

//请求时的拦截器
axios
    .interceptors
    .request
    .use(config => {
        // 发送请求之前做一些处理,loading...

        return config
    }, error => {
        // 当请求异常时做一些处理
        return Promise.reject(error)
    })

// 请求完成后的拦截器
axios
    .interceptors
    .response
    .use(response => {
        // 返回响应时做一些处理 这里的return response返回的是一个对象, 内容如下: {      data: { },        //
        // 服务器提供的响应      status: 200,      // 服务器响应的HTTP状态代码      statusText: 'OK', //
        // 服务器响应的HTTP状态消息      headers: {},      // 服务器响应头      config: {}        //
        // axios 的配置 }
        console.log(response.headers['content-type'] ,'response')
        return response
    }, error => {
        errorState(error)
        // 当响应异常时做一些处理 这里我们把错误信息扶正, 后面就不需要写 catch 了
        return Promise.resolve(error.response)
    })

const httpServer = (opts) => {

    // 公共参数
    let Public = {}

    // http默认配置
    let httpDefaultOpts = {
        method: opts.method || 'post',
        // 请求协议
        baseURL: window.data_url, // 基础 url 前缀
        url: opts.url ,
        // 请求的地址
        timeout: 3000,
        // 超时时间, 单位毫秒
        params: Object.assign(Public || {}, opts.data),
        // get 请求时带的参数 这里的 data 为什么需要用qs.stringify(data)包一下, 数据处理,
        // 主要是配合下面headers里的Content-Type, 转成表单提交, 让后端可以直接用 $_POST 拿到数据
        data: qs.stringify({param:JSON.stringify(opts.data)}),

        // post 请求的数据 请求头信息
        headers:{
                "Content-Type": "application/x-www-form-urlencoded; charset=UTF-8"
            }

    }

    if (opts.method == 'get') {
        delete httpDefaultOpts.data
    } else {
        delete httpDefaultOpts.params
    }
    let fetch = () => new Promise(function (resolve, reject) {
        axios(httpDefaultOpts).then((res) => {
            successState(res, resolve)
        })}
    )

    return fetch
};

export default httpServer